appchooser: add a GCancellable to the search operation
authorCosimo Cecchi <cosimoc@gnome.org>
Mon, 3 Oct 2011 15:47:09 +0000 (11:47 -0400)
committerCosimo Cecchi <cosimoc@gnome.org>
Tue, 4 Oct 2011 15:34:10 +0000 (11:34 -0400)
So that we can cancel it when the dialog is destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=651818

gtk/gtkappchooserdialog.c
gtk/gtkappchooseronline.c
gtk/gtkappchooseronline.h
gtk/gtkappchooseronlinepk.c

index 28c6bc0a50855343bd8d2821bd2e7aa2346c7f36..ac1f0afdd4380f95ae38cda466a74b1389cf1f7d 100644 (file)
@@ -77,6 +77,7 @@ struct _GtkAppChooserDialogPrivate {
   GtkWidget *show_more_button;
 
   GtkAppChooserOnline *online;
+  GCancellable *online_cancellable;
 
   gboolean show_more_clicked;
 };
@@ -128,17 +129,19 @@ search_for_mimetype_ready_cb (GObject      *source,
 
   _gtk_app_chooser_online_search_for_mimetype_finish (online, res, &error);
 
-  if (error != NULL)
+  if (error != NULL &&
+      !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
     {
       show_error_dialog (_("Failed to look for applications online"),
                          error->message, GTK_WINDOW (self));
-      g_error_free (error);
     }
   else
     {
       gtk_app_chooser_refresh (GTK_APP_CHOOSER (self->priv->app_chooser_widget));
     }
 
+  g_clear_error (&error);
+
   gdk_threads_leave ();
 }
 
@@ -148,9 +151,11 @@ online_button_clicked_cb (GtkButton *b,
 {
   GtkAppChooserDialog *self = user_data;
 
+  self->priv->online_cancellable = g_cancellable_new ();
   _gtk_app_chooser_online_search_for_mimetype_async (self->priv->online,
                                                     self->priv->content_type,
                                                     GTK_WINDOW (self),
+                                                     self->priv->online_cancellable,
                                                     search_for_mimetype_ready_cb,
                                                     self);
 }
@@ -612,6 +617,12 @@ gtk_app_chooser_dialog_dispose (GObject *object)
   g_clear_object (&self->priv->gfile);
   g_clear_object (&self->priv->online);
 
+  if (self->priv->online_cancellable != NULL)
+    {
+      g_cancellable_cancel (self->priv->online_cancellable);
+      g_clear_object (&self->priv->online_cancellable);
+    }
+
   G_OBJECT_CLASS (gtk_app_chooser_dialog_parent_class)->dispose (object);
 }
 
index 99454cd5ee0b6af14dad1c69724c6a3ae6b098e7..633d6fba3a96446369d071bb19367dcafa72e58d 100644 (file)
@@ -77,6 +77,7 @@ void
 _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self,
                                                    const gchar         *content_type,
                                                    GtkWindow           *parent,
+                                                   GCancellable        *cancellable,
                                                    GAsyncReadyCallback  callback,
                                                    gpointer             user_data)
 {
@@ -86,7 +87,7 @@ _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self,
 
   iface = GTK_APP_CHOOSER_ONLINE_GET_IFACE (self);
 
-  (* iface->search_for_mimetype_async) (self, content_type, parent, callback, user_data);
+  (* iface->search_for_mimetype_async) (self, content_type, parent, cancellable, callback, user_data);
 }
 
 gboolean
index a8316c1e1e627defc984eda6fe5e1372c0e1fc3f..457fb7b4d6b675b70446d5f39c4e912f38db0060 100644 (file)
@@ -46,6 +46,7 @@ struct _GtkAppChooserOnlineInterface {
   void (*search_for_mimetype_async)      (GtkAppChooserOnline  *self,
                                           const gchar          *content_type,
                                           GtkWindow            *parent,
+                                          GCancellable         *cancellable,
                                           GAsyncReadyCallback   callback,
                                           gpointer              user_data);
 
@@ -64,6 +65,7 @@ GtkAppChooserOnline * _gtk_app_chooser_online_get_default_finish         (GObjec
 void                  _gtk_app_chooser_online_search_for_mimetype_async  (GtkAppChooserOnline  *self,
                                                                           const gchar          *content_type,
                                                                           GtkWindow            *parent,
+                                                                          GCancellable         *cancellable,
                                                                           GAsyncReadyCallback   callback,
                                                                           gpointer              user_data);
 gboolean              _gtk_app_chooser_online_search_for_mimetype_finish (GtkAppChooserOnline  *self,
index 4b6df0ec22501e83a08442cec9efc02b3a651768..7bfc84de9c3f4f45317dbc64d6d239ccfaa3da63 100644 (file)
@@ -124,6 +124,7 @@ static void
 pk_search_mime_async (GtkAppChooserOnline *obj,
                       const gchar         *content_type,
                       GtkWindow           *parent,
+                      GCancellable        *cancellable,
                       GAsyncReadyCallback  callback,
                       gpointer             user_data)
 {
@@ -152,7 +153,7 @@ pk_search_mime_async (GtkAppChooserOnline *obj,
                                     "hide-confirm-search"),
                      G_DBUS_CALL_FLAGS_NONE,
                      G_MAXINT, /* no timeout */
-                     NULL,
+                     cancellable,
                      install_mime_types_ready_cb,
                      self);
 }